package com.vic.framework.proxy;

import java.lang.reflect.Method;
import java.util.List;

import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;

/**
 * 代理管理器 <br/>
 * <p>提供一个创建代理对象的方法，输入一个目标类和一组Proxy接口实现，输出一个代理对象</p>
 * <p>ProxyManager将由切面调用，印在在切面类中，需要在目标方法被调用的前后增加相应的逻辑。我们有必要写一个抽象类，让他提供
 * 一个模板方法，并在该抽象类的具体实现中扩展相应的抽象方法。而这个抽象类我们命名为AspectProxy</p>
 * @see AspectProxy
 * @author VIC
 *
 */
public class ProxyManager {

	@SuppressWarnings("unchecked")
	public static <T> T createProxy(final Class<?> targetClass, final List<Proxy> proxyList) {
		return (T) Enhancer.create(targetClass, new MethodInterceptor() {
			
			public Object intercept(Object targetObject, Method targetMethod, Object[] methodParams, MethodProxy methodProxy) throws Throwable {
				
				return new ProxyChain(targetClass, targetObject, targetMethod, methodProxy, methodParams,proxyList).doProxyChain();
			}
		});
	}

}

